################################################################################
#
#   This classes define the CUSTOM_ENEMY_APPEARANCE and ...
#   ... CUSTOM_LIVE_ENEMY element. 
#
################################################################################









################################################################################
#   Class implementations :
################################################################################

################################################################################
#   The CUSTOM_ENEMY_APPEARANCE class :
################################################################################
class CustomEnemyAppearance

  attr_accessor :image, :rect



  def initialize(enemyAppearanceElement)

    @image        = nil
    @rect         = nil
    
    @hitImage     = nil
    @hitRect      = nil

    enemyAppearanceElement.elements.each do |element|
      if    element.name == 'sprite' then
        @image, @rect = loadImage(element.text, -1)
      elsif element.name == 'hit' then
        @hitImage, @hitRect = loadImage(element.text, -1)
      else
        print "Unknown element in <enemyAppearance> element : #{element.name}. Skipping.\n"
      end
    end

  end



  def inspect

    if (@image != nil) and (@rect != nil) then
      print "sprite image loaded - "
    else
      print "sprite image not loaded - "
    end

    if (@hitImage != nil) and (@hitRect != nil) then
      print "hit image loaded\n"
    else
      print "hit image not loaded\n"
    end
      
  end



end ### End of the CUSTOM_ENEMY_APPEARANCE class ###############################










################################################################################
#   The CUSTOM_ON_HIT class :
################################################################################
class CustomOnHit < OnHit

  def initialize(onHitElement)

    onHitElement.elements.each do |element|
      @image, @rect = loadImage(element.text, -1)
    end

    @half_width   = @rect[2]/2.0.to_i
    @half_height  = @rect[3]/2.0.to_i

  end

  def run
    # Nothing yet
  end

  def draw(screen, x, y)

    @image.blit(screen, [x-@half_width,y-@half_height], @rect)

  end

end ### End of the CUSTOM_ON_HIT class #########################################










################################################################################
#   The CUSTOM_LIVE_ENEMY class :
################################################################################
class CustomLiveEnemy < LiveEnemy



  ##############################################################################
  #   Creating an instance of the LIVEENEMY class :
  ##############################################################################

  def initialize(parentLevel, x, y, enemy)

    super(parentLevel, x, y, enemy)

    @image  = @appearance.image
    @rect   = @appearance.rect

    @half_width   = @rect[2]/2.0
    @half_height  = @rect[3]/2.0

  end





  ##############################################################################
  #   ADDING a bullet source to the enemy object :
  ##############################################################################

  def addLiveBulletSource(sourceInfo)

    @sources << CustomLiveBulletSource.new(@controller, @x, @y, sourceInfo)

  end





  ##############################################################################
  #   Testing collisions with the player's shots :
  ##############################################################################

  def collisionWithProjectiles?

    @controller.projectiles.each do |p|

      distanceToProjectile = (@x-p.x)*(@x-p.x) + (@y-p.y)*(@y-p.y)

      if distanceToProjectile <= (@collisionZone + p.collisionZone)**2 then
        if p.status == :alive
          @lifePoints-=p.damage
          p.status = :hit
          @status = :hit
        end
      end

    end

  end





  ##############################################################################
  #   Testing collision with the player itself :
  ##############################################################################

  def collisionWithPlayer?

    px = @controller.player.x
    py = @controller.player.y
    pr = @controller.player.collisionZone

    distanceToPlayer = (@x-px)*(@x-px) + (@y-py)*(@y-py)

    if distanceToPlayer <= (@collisionZone + pr)**2 then
      @parentLevel.controller.player.status = :hit
    end

  end





  ##############################################################################
  #   Testing collisions between the enemy's bullets and the player :
  ##############################################################################

  def didHitPlayer?

    @sources.each do |s|

      s.liveBullets.each do |b|

        px = @controller.player.x
        py = @controller.player.y
        pr = @controller.player.collisionZone

        distanceToPlayer = (b.x-px)*(b.x-px) + (b.y-py)*(b.y-py)

        if distanceToPlayer <= (s.collisionZone + pr)**2 then
          @parentLevel.controller.player.status = :hit
        end

      end
    end

  end



  ##############################################################################
  #   DRAWING :
  ##############################################################################

  def draw

    case @status
    when :alive

      # Draw self : ############################################################
      @image.blit(@controller.screen, [@x-@half_width,@y-@half_height], @rect)

      @controller.screen.draw_circle([@x,@y], @collisionZone, [255, 255, 255])

      # Draw bullet sources : ##################################################
      super

    when :hit

      # Draw self : ############################################################
      @onHit.draw(@controller.screen, @x, @y)

      @controller.screen.draw_circle([@x,@y], @collisionZone, [255, 255, 255])

      # Draw bullet sources : ##################################################
      super

    #when :dying

      # Nothing there yet ...

    end
      
  end

end ### End of the CUSTOM_LIVE_ENEMY class #####################################
